export const getInputs = () => [
	[[1, -10, 7, 13, 6, 8], 5],
	[[1, -10, 7, 13, 6, 8], 7],
	[[3, 0, 3, 2, 4, 2, 1, 1, 0, 4], 5],
	[[0, -3], 4],
];

/**
 * **[6321. 执行操作后的最大 MEX](https://leetcode.cn/contest/weekly-contest-337/problems/smallest-missing-non-negative-integer-after-operations/)**
 *
 * 给你一个下标从 **0** 开始的整数数组 `nums` 和一个整数 `value` 。
 *
 * 在一步操作中，你可以对 `nums` 中的任一元素加上或减去 `value` 。
 * - 例如，如果 `nums = [1,2,3]` 且 `value = 2` ，你可以选择 `nums[0]` 减去 `value` ，得到 `nums = [-1,2,3]` 。
 *
 * 数组的 MEX (minimum excluded) 是指其中数组中缺失的最小非负整数。
 * - 例如，`[-1,2,3]` 的 MEX 是 `0` ，而 `[1,0,3]` 的 MEX 是 `2` 。
 *
 * 返回在执行上述操作 **任意次** 后，`nums` 的最大 MEX 。
 *
 * @param nums
 * @param value
 * @returns
 */
export default function (nums: number[], value: number): number {
	const length = nums.length;
	const minMap = new Map<number, number>();
	for (let i = 0; i < value; i++) {
		minMap.set(i, i);
	}

	const map = new Map<number, boolean>();
	nums.forEach((num) => {
		const initialKey = num % value < 0 ? (num % value) + value : num % value;
		let key = Math.max(minMap.get(initialKey)!, initialKey);
		while (map.has(key)) {
			key += value;
		}
		minMap.set(initialKey, key);
		map.set(key, true);
	});

	for (let i = 0; i < length; i++) {
		if (!map.has(i)) return i;
	}

	return length;
}
